package modele.Unite;

import java.io.Serializable;
import java.util.LinkedList;

import modele.Direction;
import modele.Joueur;
import modele.Map;
import modele.Position;

public abstract class Unite implements Serializable{
	private static final long serialVersionUID = 1682228449609801110L;
	protected float vitesseDeplacement;
	protected Position position;
	protected Direction direction;
	protected int coutCreationOr;
	protected int coutCreationElixir;
	protected Joueur joueur;
	
	
	
	protected LinkedList<Direction> listeDirection;
	protected Position positionArrivee;

	public Position getPositionArrivee() {
		return positionArrivee;
	}

	public void setPositionArrivee(Position positionArrivee) {
		this.positionArrivee = positionArrivee;
	}

	public Unite(int vitesseDeplacement, Position position, Direction direction, int coutCreationOr, int coutCreationElixir, Joueur joueur)
	{
		this.vitesseDeplacement = vitesseDeplacement;
		this.position = position;
		this.direction = direction;
		this.coutCreationOr = coutCreationOr;
		this.coutCreationElixir = coutCreationElixir;
		this.joueur = joueur;
	}

	/**
	 * 
	 * @param map Map sur laquelle l'unité va se déplacer
	 * TODO elle doit gérer le fait qu'on rentre dans un mur : si on rentre dans un mur alors on recalcule le chemin et on se redeplace
	 */
	public void seDeplacer(Map map) {
		Direction directionDeplacement = null;
		if(listeDirection.size() > 0)
		{
			directionDeplacement = listeDirection.remove(listeDirection.size()-1);//on prend la prochaine direction
		}
		
		
		//System.out.println(directionDeplacement);
		
		if(directionDeplacement != null)
		{
			switch (directionDeplacement)
			{
		        case HAUT:
		        		//System.out.println("HAUT");
		        		//if(map.estLibre(new Position(this.position.getL()+1,this.position.getC())))
		        		//{
		        		//	System.out.println("place libre");
		        			//this.position = new Position(this.position.getC(),this.position.getL()+1);
		        			position.allerVersLeHaut();
		        		//}
		        			//else
		        			//{
		        			//	System.out.println("place non libre");
		        			//	this.listeDirection = map.chercherChemin(this.position, positionArrivee, 15);
		        			//	this.seDeplacer(map);//ne peut pas rencontrer de problème
		        			//}
		        		break;
		        case BAS:
		        	//System.out.println("BAS");
		        	// 	if(map.estLibre(new Position(this.position.getL()-1, this.position.getC())))
		        	//	{
			        		//this.position = new Position(this.position.getC(),this.position.getL()-1);
			        		position.allerVersLeBas();
			        		//	}
			        		//	else
			        		//	{
			        		//		this.listeDirection = map.chercherChemin(this.position, positionArrivee, 1000);
			        		//		this.seDeplacer(map);//ne peut pas rencontrer de problème
			        		//	}
		                 break;
		        case GAUCHE:
		        	//	System.out.println("GAUCHE");
		        	//	if(map.estLibre(new Position(this.position.getL(), this.position.getC()-1)))
		        	//	{
		        	//		//this.position = new Position(this.position.getC()-1,this.position.getL());
			        		position.allerVersLaGauche();
			        		//	}
			        		//	else
			        		//	{
			        		//		this.listeDirection = map.chercherChemin(this.position, positionArrivee, 1000);
			        		//		this.seDeplacer(map);//ne peut pas rencontrer de problème
			        		//	}
		        		break;
		        case DROITE:
		        	//	System.out.println("DROITE");
		        	//	if(map.estLibre(new Position(this.position.getL(),this.position.getC()+1)))
		        	//	{
		        			//this.position = new Position(this.position.getC()+1,this.position.getL());
		        			position.allerVersLaDroite();
		        			//	}
		        			//	else
		        			//	{
		        			//		this.listeDirection = map.chercherChemin(this.position, positionArrivee, 1000);
		        			//		this.seDeplacer(map);//ne peut pas rencontrer de problème
		        			//	}
		        		break;
			}
		}
	}
	

	public float getVitesseDeplacement() {
		return vitesseDeplacement;
	}

	public void setVitesseDeplacement(int vitesseDeplacement) {
		this.vitesseDeplacement = vitesseDeplacement;
	}

	public Position getPosition() {
		return position;
	}

	public void setPosition(Position position) {
		this.position = position;
	}

	public Direction getDirection() {
		return direction;
	}

	public void setDirection(Direction direction) {
		this.direction = direction;
	}

	public LinkedList<Direction> getListeDirection() {
		return listeDirection;
	}

	public void setListeDirection(LinkedList<Direction> listeDirection) {
		this.listeDirection = listeDirection;
	}
	
	public int getCoutCreationOr()
	{
		return coutCreationOr;
	}
	
	public int getCoutCreationElixir()
	{
		return coutCreationElixir;
	}
	
	public void setJoueur(Joueur j)
	{
		this.joueur = j;
	}
	
	abstract public void actionApresCreation(Joueur joueur);
}
